package dominio;

public abstract class Movimiento {

	public Movimiento() {
		
	}
	
	public abstract Resultado explotar(int nroFila,int nroColumna,Tablero t);
	public abstract boolean chequearMovimiento(int nroFila,int nroColumna,Tablero t);;
	/*
	 * Verifica si hay 3 o mas caramelos consecutivos para realizar explocion. (Comparo contra >=3 porque es el minimo para realizar una explocion) 
	 */
	public boolean movimientoProduceExplocionEnFila(int nroFila, Tablero t){
		boolean produceExplocion = false;
		int contadorConsecutivos = 0;
		for(int i = 0; i < t.getNroColumnas()-1; i++){
			if(t.getMatrizTablero()[nroFila][i].getColor().equals(t.getMatrizTablero()[nroFila][i+1].getColor())){ 
				contadorConsecutivos++;
				if(contadorConsecutivos>=3){ 
					produceExplocion = true;
					break;}
			}
			else{ 
				contadorConsecutivos = 0;
			}
		}
		return produceExplocion;
	}
	
	/*
	 * Verifica si el movimiento a realizar produce una explocion en la columna.
	 */
	public boolean movimientoProduceExplocionEnColumna(int nroColumna, Tablero t){
		boolean produceExplocion = false;
		int contadorConsecutivos = 0;
		for(int i = 0; i < t.getNroFilas()-1; i++){
			if(t.getMatrizTablero()[i][nroColumna].getColor().equals(t.getMatrizTablero()[i+1][nroColumna].getColor())){ 
				contadorConsecutivos++;
				if(contadorConsecutivos>=3){
					produceExplocion = true;
					break;}
			}
			else{ 
				contadorConsecutivos = 0;
			}
		}
		return produceExplocion;
	}
	
	/*
	 * Propaga la explocion de los caramelos en la fila.
	 */
	public int explotarEnFila(int nroFila,int nroColumna, Tablero t){
		int limiteIzquierdo = nroColumna;    //Sirve para chequear los limites del tablero desde la posicion de comienzo
		int limiteDerecho = nroColumna;
		int contadorDeCaramelosExplotados = 0;   //Cuenta los caramelos explotados.
		boolean carameloIzquierdoExplota = true;  //Verifica la propagacion de explocion hacia un lado y otro
		boolean carameloDerechaExplota = true;
		String colorCarameloAExplotar = (t.getMatrizTablero()[nroFila][nroColumna]).getColor();  //Color de los caramelos contiguos a explotar.
		for(int i=0;i<t.getNroColumnas()-1;i++){  //Comienzo la propagacion.
			limiteIzquierdo--;
			limiteDerecho++;
			if((limiteIzquierdo >= 0) && carameloIzquierdoExplota){   //verifico si esta dentro del limite y hay caramelo a explotar
				Caramelo carameloIzquierdo = t.getMatrizTablero()[nroFila][limiteIzquierdo];
				if (carameloIzquierdo.getColor().equals(colorCarameloAExplotar)){  //Verifico que el color del caramelo de al lado sea del mismo color del caramelo a explotar.
					t.insertInto(nroFila, limiteIzquierdo, null);
					contadorDeCaramelosExplotados++;
				}else {carameloIzquierdoExplota = false;}   //Si el caramelo de al lado es de otro color no exploto mas.
			}
			//Idem verificacion de arriba pero hacia la derecha.
			if((limiteDerecho <= t.getNroColumnas()-1) && carameloDerechaExplota){
				Caramelo carameloDerecho = t.getMatrizTablero()[nroFila][limiteDerecho];
				if (carameloDerecho.getColor().equals(colorCarameloAExplotar)){
					t.insertInto(nroFila, limiteDerecho, null);
					contadorDeCaramelosExplotados++;
				}else {carameloDerechaExplota = false;}
			}
		}
		return contadorDeCaramelosExplotados;
	}

	/*
	 * Propaga la explocion de los caramelos en la columna.
	 */
	public int explotarEnColumna(int nroFila,int nroColumna, Tablero t){
		int limiteArriba = nroFila;    //Sirve para chequear los limites del tablero desde la posicion de comienzo
		int limiteAbajo = nroFila;
		int contadorDeCaramelosExplotados = 0;   //Cuenta los caramelos explotados.
		boolean carameloArribaExplota = true;  //Verifica la propagacion de explocion hacia un lado y otro
		boolean carameloAbajoExplota = true;
		String colorCarameloAExplotar = (t.getMatrizTablero()[nroFila][nroColumna]).getColor();  //Color de los caramelos contiguos a explotar.
		for(int i=0;i<t.getNroColumnas()-1;i++){  //Comienzo la propagacion.
			limiteArriba--;
			limiteAbajo++;
			if((limiteArriba >= 0) && carameloArribaExplota){   //verifico si esta dentro del limite y hay caramelo a explotar
				Caramelo carameloIzquierdo = t.getMatrizTablero()[limiteArriba][nroColumna];
				if (carameloIzquierdo.getColor().equals(colorCarameloAExplotar)){  //Verifico que el color del caramelo de al lado sea del mismo color del caramelo a explotar.
					t.insertInto(limiteArriba, nroColumna, null);
					contadorDeCaramelosExplotados++;
				}else {carameloArribaExplota = false;}   //Si el caramelo de al lado es de otro color no exploto mas.
			}
			//Idem verificacion de arriba pero hacia abajo.
			if((limiteAbajo <= t.getNroFilas()-1) && carameloAbajoExplota){
				Caramelo carameloDerecho = t.getMatrizTablero()[limiteAbajo][nroColumna];
				if (carameloDerecho.getColor().equals(colorCarameloAExplotar)){
					t.insertInto(limiteAbajo, nroColumna, null);
					contadorDeCaramelosExplotados++;
				}else {carameloAbajoExplota = false;}
			}
		}
		return contadorDeCaramelosExplotados;
	}
	
	
}
